#ifndef BBOX_HPP
#define BBOX_HPP

struct bbox;
struct bbox
{
  bbox()
  { depth=1;
    ix=0;
    iy=0;
    iz=0;
  }
  
    double
    x0,y0,z0,
    ax,ay,az;
    int depth;
    int ix,iy,iz;
    bbox(double _x0,
         double _y0,
         double _z0,
         double _ax,
         double _ay,
         double _az,
         int _depth=1,
         int _ix=0,
         int _iy=0,
         int _iz=0)
    {
        x0=_x0;
        y0=_y0;
        z0=_z0;
        ax=_ax; 
        ay=_ay;
        az=_az;
        depth=_depth;
        ix=_ix;
        iy=_iy;
        iz=_iz;
    }

  bbox extend(double val) const  
  {
    bbox ex=*this;
    ex.x0-=val;
    ex.y0-=val;
    ex.z0-=val;

    ex.ax+=2*val;
    ex.ay+=2*val;
    ex.az+=2*val;

    return ex;
    
  }
  
  
  
    bbox subbox(unsigned int i) const
    {
        if (i>=8)
            throw;
        bbox n=*this;

        n.ax/=2;
        n.ay/=2;
        n.az/=2;

        n.depth*=2;
        n.ix*=2;
        n.iy*=2;
        n.iz*=2;

        switch (i)
        {
        case 0:
            break;
        case 1:
            n.y0+=n.ay;
            n.iy++;
            break;
        case 2:
            n.x0+=n.ax;
            n.ix++;
            n.y0+=n.ay;
            n.iy++;
            break;
        case 3:
            n.x0+=n.ax;
            n.ix++;
            break;
        case 4:
            n.z0+=n.az;
            n.iz++;
            break;
        case 5:
            n.y0+=n.ay;
            n.iy++;
            n.z0+=n.az;
            n.iz++;
            break;
        case 6:
            n.x0+=n.ax;
            n.ix++;
            n.y0+=n.ay;
            n.iy++;
            n.z0+=n.az;
            n.iz++;
            break;
        case 7:
            n.x0+=n.ax;
            n.ix++;
            n.z0+=n.az;
            n.iz++;
            break;
        default: ;
	  
        };
        return n;
    }
};

#endif
